import 'dart:ui';

import 'package:flutter/material.dart';

class VerticalDottedLine extends CustomPainter {
  final double width;
  final double height;
  final double dotSpacing;
  final double dotSize;
  final Color color;

  VerticalDottedLine({
    required this.width,
    required this.height,
    required this.dotSpacing,
    required this.dotSize,
    required this.color,
  });

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = color
      // 点的大小即为线的粗细，因为是绘制点而非线，所以这里用的是点的大小而非线宽来定义粗细感
      ..strokeWidth = dotSize;

    // 从中间开始画点，避免线条两端有空隙
    double y = dotSize / 2;

    while (y < height) {
      // 在中间位置画点。由于我们用的是drawPoints，所以实际上是在画点而不是线段。如果要画线段，则需要使用drawLine。
      // 这里为了演示效果用的是点。如果要画线段，可以改为：canvas.drawLine(Offset(width / 2 - dotSize / 2, y), Offset(width / 2 + dotSize / 2, y), paint); 来代替这一行。
      // 但为了保持点状效果，我们还是使用drawPoints。
      canvas.drawPoints(PointMode.points, <Offset>[Offset(width / 2, y + 3)], paint);
      // 计算下一个点的位置。注意加上点的尺寸，以避免重叠。如果是线段，则不需要加点的尺寸
      y += dotSpacing + dotSize;
    }
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    // 如果绘制内容不依赖于外部数据，返回false以优化性能
    return false;
  }

}